package org.lifei.auth.service.impl;

import org.lifei.auth.dto.LoginDTO;
import org.lifei.auth.service.ILoginService;
import org.lifei.base.context.LoginContext;
import org.lifei.org.domain.Employee;
import org.lifei.org.service.IEmployeeService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

@Service
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
public class LoginServiceImpl implements ILoginService {
    @Autowired
    private IEmployeeService employeeService;

    @Override
    public Map<String,Object> login(LoginDTO loginDTO) {
        // 判断 loginDTO 是否是空的
        if (Objects.isNull(loginDTO.getUsername())
                || Objects.isNull(loginDTO.getPassword())){
            throw new RuntimeException("账号或密码为空..");
        }
        // 拿着数据查数据库
        /*
            方案一 账号密码一起查 通过判断是否查到数据 返回数据
            方案二 通过账号先去查 在根据查到的数据比较密码  然后在返回  √
         */
        Employee employee = employeeService.selectByUsername(loginDTO);
        if (Objects.isNull(employee)){
            throw new RuntimeException("账号或密码错误..");
        }
        if (!employee.getPassword().equals(loginDTO.getPassword().trim())){
            throw new RuntimeException("账号或密码错误..");
        }
        // 登录这里 真的是直接反回 employee对象吗?
        // 后台 1. 返回前端的数据是 前端要什么 后台返回什么 不要多返回
        // 2. 敏感的数据 一定要脱敏
        Employee employee1 = new Employee();
        BeanUtils.copyProperties(employee,employee1);
        employee1.setPassword("");
        /*
            思考 如何在后续的接口中 判断是否用户已经认证了?
            有没有一种方案
                当用户认证成功的以后,将用户的数据 存在后台
                以后每一次的 接口认证查询 都看看后台是否有对应的用户数据
         */
        // 生成token
        String token = UUID.randomUUID().toString();
        LoginContext.loginMap.put(token,employee);
        HashMap<String, Object> data = new HashMap<>();
        data.put("token",token);
        data.put("user",employee1);
        return data;
    }
}
